package uk.co.magiclantern.mvc.model
{
	import uk.co.magiclantern.mvc.imvc.*;
	import flash.display.Sprite;
	import flash.net.*;
	import flash.events.*;
	import flash.utils.Proxy;
	

	
	
	public class MLPAbstractModel implements IModel
	{
	
	private var _observers:Array;
	private var _newdata:Object;
	private var _vo:Object;
	
	

	

	
	 ///////////////////////////////////////////////////////////////
	 //
	 //  Constructor
	 //
	 ///////////////////////////////////////////////////////////////	
	 public function MLPAbstractModel ()
	 {
	 	trace ("Model: I collect data");
	 	setobservers();
	 	getVO();
	 }
	 
	 ///////////////////////////////////////////////////////////////
	 //
	 //  Methods
	 //
	 ///////////////////////////////////////////////////////////////	 
	 public function registerObserver(o:IView):void
	 {
	 	getobservers().push(o);
	 	trace ("Observer count: " + getobservers().length);
	 }
	 
	 public function removeObserver(o:IView):void
	 {
	 	for (var i:uint = 0; i< getobservers().length; i++)
	 	{
	 		if (o == getobservers()[i])
	 		{
	 			getobservers().splice(i,1);
	 		}
	 	}
	 	trace ("Observer count: " + getobservers().length)
	 }
	 
	 public function notifyObservers():void
	 {
	 	for (var i:uint = 0; i< getobservers().length; i++)
	 	{
	 		
	 		getobservers()[i].update(newdata)
	 		
	 	}
	 }
	 
	 public function genericfunction(func:String, ...rest):void
		{
			try
			{
			
			 if (rest.length > 0)
			this[func](rest);
			else
			this[func]();
			} catch (e:ReferenceError){
				var mmp:MLPModelProxy = new MLPModelProxy();
				mmp.callProperty(func, rest)
				
			}
			
			/**/
	}
	 ///////////////////////////////////////////////////////////////
	 //
	 //  Unique Methods/ Event Listeners
	 //
	 ///////////////////////////////////////////////////////////////
	 
		

	 ///////////////////////////////////////////////////////////////
	 //
	 //  Getter / setters
	 //
	 ///////////////////////////////////////////////////////////////
	 
	 public function setobservers():void
	 {
	 	trace ("Init observers array")
	 	_observers = [];
	 }	


	 public function getobservers():Array 
	 {
	 	return _observers;
	 }
	 
	 
	 public function setVO(vo:Object = null):void
	 {
	 
	 }
	 
	 public function getVO():Object
	 {
	 	return _vo;
	 }
	 
	 public function setData(o:Object):void
	{
			trace ("setData")
			newdata = o;
			dataChanged();
	}
		
	public function dataChanged():void
		{
			trace ("data changed")
			notifyObservers();
		}
		
	public function set newdata (o:Object):void
		{
			_newdata = o;
		}
		
	public function get newdata ():Object
		{
			return _newdata
		}
	}
}

include "modelproxyinclude.as"